#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

// int main()
// {
//     printf("Before: I am a process, pid: %d, ppid: %d\n", getpid(), getppid());

//     // execl函数的写法
//     // 第一个参数：可执行文件的路径，最后一个必须是NULL，中间是可执行文件的方式
//     // execl("/usr/bin/ls", "ls", "-l", "-a", NULL);

//     // execlp函数的写法
//     // 第一个参数：可执行程序名即可
//     // execlp("ls", "ls", "-a", "-l", NULL);

//     // execv函数的写法
//     // char *const myargv[] = {
//     //     "ls",
//     //     "-a",
//     //     "-l",
//     //     NULL};
//     // execv("/usr/bin/ls", myargv);

//     // execvp函数的写法
//     char *const myargv[] = {
//         "ls",
//         "-a",
//         "-l",
//         NULL};
//     execvp("ls", myargv);

//     printf("After: I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
//     return 0;
// }

// 多进程——程序替换
// int main()
// {
//     __pid_t id = fork();
//     if (id == 0)
//     {
//         // child
//         printf("Before: I am a child, pid: %d, ppid: %d\n", getpid(), getppid());
        
//         // execl("/usr/bin/ls", "ls", "-l", NULL);
//         execl("./otherExe", "otherExe", "-a", "-b", "-c", NULL);

//         printf("After: I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
//         exit(0);
//     }
//     // father
//     __pid_t ret = waitpid(id, NULL, 0);
//     if(ret == id)
//     {
//         printf("wait success, father pid: %d, ppid: %d\n",getpid(), getppid());
//     }
//     sleep(5);
//     return 0;
// }


// 验证 环境变量 envp
int main()
{
    __pid_t id = fork();
    if(id == 0)
    {
        // child
        printf("before: I am a process, pid: %d, ppid:%d\n", getpid(), getppid());
        // 我自己定义的环境变量
        char* const myenv[] = {
            "MY_VAL=123456666",
            "MY_PATH=/usr/a",
            NULL
        };
        execle("./otherExe", "otherExe", "-a", "-b", NULL, myenv);  // 替换otherExe程序
        exit(errno);
    }
    // father
    __pid_t ret = waitpid(id, NULL, 0);
    if(ret == id)
    {
        printf("wait success, father pid: %d, ppid: %d\n",getpid(), getppid());
    }
    sleep(5);
    return 0;
}